#include <sys_head.h>
#include "arg.h"

//argv[1] IP地址
//argv[2] 端口

void Server(int Sock_fd);

int main(int argc, char const *argv[])
{
    //判断命令行参数
    if (3 != argc)
    {
        printf("参数错误:%s ip port\n",argv[0]);
        return -1;
    }
    
    // 1、创建套接字
    int Sock_fd = socket(AF_INET,SOCK_STREAM,0);
    if (-1 == Sock_fd)
    {
        ERRLOG("socket err");
        return -1;
    }
    // ​2、填充服务器网络信息结构体
    struct sockaddr_in Sock_addr;
    Sock_addr.sin_family = AF_INET;                 //选择IPV4
    Sock_addr.sin_port = htons(atoi(argv[2]));      //给定端口 atoi 将字符串转化为数字
    Sock_addr.sin_addr.s_addr = inet_addr(argv[1]); //IP地址

    socklen_t Sock_size = sizeof(Sock_addr);
    // 3​、将套接字与服务器的网络信息结构体绑定
    if(-1 == bind(Sock_fd,(struct sockaddr *)&Sock_addr,Sock_size))
    {
        ERRLOG("bind err");
        return -1;
    }
    // ​4、将套接字设置城 监听状态
    if (-1 == listen(Sock_fd,5))
    {
        ERRLOG("listen err");
        return -1;
    }
    // ​5、阻塞等待客户端连接 accept
    int acc_fd = accept(Sock_fd,NULL,NULL);
    if (-1 == acc_fd)
    {
        ERRLOG("accept err");
        return -1;
    }
    // ​6、数据手法 write read
    Server(acc_fd);

    // ​7、关闭套接字  close
    close(acc_fd);
    close(Sock_fd);
    return 0;
}

void Server(int Sock_fd)
{
    // //发送测试
    // char buf[128] = "发送测试";
    // send(Sock_fd,buf,strlen(buf),0);
    // return;

    //发送协议
    agr info;
    //字符串
    char buf[128];

    int n;//用于记录用户的选择

    //清空字符串和协议信息
    memset(buf,0,sizeof(buf));
    memset(info.buf,0,sizeof(info.buf));

    //发送连接成功给客户端
    strcpy(buf,"连接成功");
    send(Sock_fd,buf,strlen(buf),0);

    //清空字符串
    memset(buf,0,sizeof(buf));

    //接受客户端的内容
    recv(Sock_fd,buf,sizeof(buf),0);
    printf("%s\n",buf);

    //开始进行数据收发
    while (1)
    {
        puts("请选择传输方式:1 改名字 2 信息 3 文件");
        scanf("%d", &n);

        // 清空字符串和协议信息
        memset(buf, 0, sizeof(buf));
        memset(info.buf, 0, sizeof(info.buf));

        switch (n)
        {
        case 1:
            // 获取数据
            puts("请输入姓名:");
            scanf("%s",buf);

            // 组装数据
            strcpy(info.Name.Name , buf);
            info.Name.bytes = 1;

            // 发送数据
            send(Sock_fd,info.buf,strlen(info.buf),0);

            break;
        case 2:
            // 获取数据
            puts("信息:");
            scanf("%s", buf);

            // 组装数据
            strcpy(info.Data.Data,buf);
            info.Data.bytes = 2;

            // 发送数据
            send(Sock_fd,info.buf,sizeof(info.buf),0);

            if (!strcmp(info.Data.Data, "quit"))
            {
                printf("退出成功\n");
                return;
            }
            break;
        case 3:

            break;
        default:
            n = 0;
            break;
        }
    }
}